import 'package:flutter/animation.dart';
import 'package:flutter/foundation.dart';
import 'enums.dart';
import 'package:meta/meta.dart';

class RefreshController {
  /// 刷新状态的通知器。
  final ValueNotifier<RefreshStatus> _refreshNotifier;

  /// 加载状态的通知器。
  final ValueNotifier<LoadStatus> _loadNotifier;

  /// 提供一个公开的、只读的 ValueListenable，以便外部（如UI）可以监听状态变化，
  /// 而不能直接修改它。这是更好的封装实践。
  ValueListenable<RefreshStatus> get refreshState => _refreshNotifier;
  ValueListenable<LoadStatus> get loadState => _loadNotifier;

  RefreshController({
    RefreshStatus initialRefreshStatus = RefreshStatus.idle,
    LoadStatus initialLoadStatus = LoadStatus.idle,
  })  : _refreshNotifier = ValueNotifier(initialRefreshStatus),
        _loadNotifier = ValueNotifier(initialLoadStatus);

  /// 刷新指示器的当前状态。
  RefreshStatus get refreshStatus => _refreshNotifier.value;

  /// 加载指示器的当前状态。
  LoadStatus get loadStatus => _loadNotifier.value;

  /// 手动触发刷新。
  /// [duration] 是指示器从隐藏到完全展示的动画时间。
  /// [curve] 是动画曲线。
  void requestRefresh({
    Duration duration = const Duration(milliseconds: 300),
    Curve curve = Curves.linear,
  }) {
    // 只有在空闲状态下才能手动触发刷新
    if (refreshStatus == RefreshStatus.idle) {
      _refreshNotifier.value = RefreshStatus.refreshing;
    }
  }

  /// 当刷新操作成功时调用此方法。
  /// [resetAfter] 是“成功”状态显示后，自动回到 idle 状态的延迟时间。
  void refreshCompleted({Duration resetAfter = const Duration(milliseconds: 800)}) {
    if (refreshStatus == RefreshStatus.refreshing) {
      _refreshNotifier.value = RefreshStatus.completed;
      resetLoadStatus();// 重置加载状态
      Future.delayed(resetAfter, () {
        if (_refreshNotifier.value == RefreshStatus.completed) {
          _refreshNotifier.value = RefreshStatus.idle;
        }
      });
    }
  }

  /// 当刷新操作失败时调用此方法。
  /// [resetAfter] 是“失败”状态显示后，自动回到 idle 状态的延迟时间。
  void refreshFailed({Duration resetAfter = const Duration(milliseconds: 800)}) {
    if (refreshStatus == RefreshStatus.refreshing) {
      _refreshNotifier.value = RefreshStatus.failed;
      Future.delayed(resetAfter, () {
        if (_refreshNotifier.value == RefreshStatus.failed) {
          _refreshNotifier.value = RefreshStatus.idle;
        }
      });
    }
  }

  /// 手动触发加载。
  void requestLoading() {
    if (loadStatus == LoadStatus.idle) {
      _loadNotifier.value = LoadStatus.loading;
    }
  }

  /// 当加载操作成功时调用此方法。
  void loadComplete() {
    if (loadStatus == LoadStatus.loading) {
      _loadNotifier.value = LoadStatus.idle;
    }
  }

  /// 当加载操作失败时调用此方法。
  void loadFailed() {
    if (loadStatus == LoadStatus.loading) {
      _loadNotifier.value = LoadStatus.failed;
    }
  }

  /// 当没有更多数据可加载时调用此方法。
  void loadNoData() {
    if (loadStatus == LoadStatus.loading) {
      _loadNotifier.value = LoadStatus.noMoreData;
    }
  }

  /// 将加载状态从“无更多数据”或“失败”重置为“空闲”。
  /// 这在刷新后或用户点击重试后特别有用。
  void resetLoadStatus() {
    if (loadStatus == LoadStatus.noMoreData || loadStatus == LoadStatus.failed ) {
      _loadNotifier.value = LoadStatus.idle;
    }
  }


  /// 销毁控制器及其通知器。
  void dispose() {
    _refreshNotifier.dispose();
    _loadNotifier.dispose();
  }

  /// [INTERNAL USE ONLY]
  // --- 内部使用方法 ---
  // 允许 Refresher 内部修改状态，但不暴露给外部用户
  @internal
  void setRefreshStatus(RefreshStatus status) {
    _refreshNotifier.value = status;
  }

  @internal
  void setLoadStatus(LoadStatus status) {
    _loadNotifier.value = status;
  }
}
